/* ts会自己推断什么类型 */
/* type 关键字（可以给一个类型定义一个名字）多用于复合类型& */
type str = string
let ss: str = '我是小满'
console.log(ss)

// 定义函数别名
type str1 = () => string
let s1: str1 = () => '我是小满'
console.log(s1)
// 定义联合类型别名
type str2 = string | number
let s22: str2 = 123
let s2: str2 = '123'
console.log(s2, s22)
// 定义值的别名
type value = boolean | 0 | '213'
let s3: value = true
// 变量s3的值  只能是上面value定义的值

/* type 和 interface 还是一些区别的 虽然都可以定义类型
1.interface可以继承  type 只能通过 & 交叉类型合并
2.type 可以定义 联合类型 和 可以使用一些操作符 interface不行
3.interface 遇到重名的会合并 type 不行 
*/

/* 
type a = 1 extends number ? 1 : 0 //1
type a = 1 extends Number ? 1 : 0 //1
type a = 1 extends Object ? 1 : 0 //1
type a = 1 extends any ? 1 : 0 //1
type a = 1 extends unknow ? 1 : 0 //1
type a = 1 extends never ? 1 : 0 //0 */
